package de.pmg_grandma;

import interfaces.AbstractFood;
import interfaces.AbstractWish;
import java.util.ArrayList;
import java.util.List;
import enums.WishType;
import database.DatabaseBot;
import model.Model;
import wishes.WishToEat;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningServiceInfo;
import android.app.ListActivity;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.speech.RecognizerIntent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import animation.GrandmaAnimation;
import enums.ClockMode;
import enums.State;

public class MainActivity extends ListActivity {
	
	
	private ClockMode clockState  = ClockMode.Awake;//Status für das ClockView
	public static MainActivity mainActivity;		//this
	private static int lastCountOfWishes = 0;		//Anzahl der Wünsche
	int index = 0;									//Zähler für die Wunschwolke
	
	boolean ersterAufruf = true;					//Extra-Feature: Eingabe der E-Mail-Adresse
	GrandmaAnimation grandMaAnimation;				//Animation der Oma im Schaukelstuhl

	//option menu create
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return super.onCreateOptionsMenu(menu);
	}
	//option menu listener
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		Intent intent = new Intent(this, OptionActivity.class);
		switch (item.getItemId()) {
		//popup Fenster für Hilfe
		case R.id.opt_hilfe:
			intent.putExtra("AuswahlOption", "opt_hilfe");
			startActivity(intent);
			return true;
		//popup Fenster für Einstellungen (E-mail Benachrichtigung)
		case R.id.opt_einstellungen:
			intent.putExtra("AuswahlOption", "opt_settings");
			startActivity(intent);
			return true;
		//popup Fenster für developer
		case R.id.opt_developer:
			intent.putExtra("AuswahlOption", "opt_developer");
			startActivity(intent);
			return true;
		//schließe app
		case R.id.opt_exit:
			this.finish();
			return true;
		}
		return super.onOptionsItemSelected(item);
	}

	//B U T T O N S
	public void onButtonClick(View view) {
		//Öffne neue Aktivity
		if(view.getId() == R.id.btn_ma_putzen_waschen_spuelen) {
			startActivity(new Intent(this, CleanActivity.class));
		}
		else if(view.getId() == R.id.btn_ma_medikamente) {
			startActivity(new Intent(this, MedicineActivity.class));
		}
		else if(view.getId() == R.id.btn_ma_essen_trinken) {
			startActivity(new Intent(this, KitchenActivity.class));
		}
		else if(view.getId() == R.id.btn_ma_schlafen_ankleiden){
			startActivity(new Intent(this, SleeproomActivity.class));
		}
		else if(view.getId() == R.id.btn_ma_einkaufen) {
			startActivity(new Intent(this, StockActivity.class));
		}
		else if(view.getId() == R.id.btn_ma_generateButton) {
			startActivity(new Intent(this, GenerateWishesActivity.class));
		}
		//auf Wunschwolke geklickt
		else if(view.getId() == R.id.imageWunsch) {
			if (index > Model.getInstance().getWishes().size() - 1) {
				index = 0;
			}
			//den Wunsch zwischenspeicher, der gerade in der Wolke ist
			AbstractWish wish = Model.getInstance().getWishes().get(index);
			//richtige Activity starten
			switch (wish.getType()) {
			case WishToEat: startActivity(new Intent(this, KitchenActivity.class)); break;
			case WishToDrink: startActivity(new Intent(this, KitchenActivity.class)); break;
			case WishToSleep: startActivity(new Intent(this, SleeproomActivity.class)); break;
			case WishToTakeMedicine: startActivity(new Intent(this, MedicineActivity.class)); break;
			case WishToWashDishes: startActivity(new Intent(this, CleanActivity.class)); break;
			case WishToWashClothes: startActivity(new Intent(this, CleanActivity.class)); break;
			case WishToShop: startActivity(new Intent(this, StockActivity.class)); break;
			case WishToCleanApartment: startActivity(new Intent(this, CleanActivity.class)); break;
			}
		}
	}
	//Spracherkennung ButtonClick und ActivityResult
	public void onMicroClick(View view){
		//Spracherkennungs activity wählen
		Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
		//Sprachmodel wählen
		intent.putExtra(
				RecognizerIntent.EXTRA_LANGUAGE_MODEL, 
				RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
		//Text, der Angezeigt werden soll setzen
		intent.putExtra(RecognizerIntent.EXTRA_PROMPT, 
				getResources().getString(R.string.txt_sprechen_sie));
		//ausführen und auf resultat warten
		startActivityForResult(intent, R.id.btn_microphone);
	}
	//Resultat bearbeiten
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		ArrayList<String> treffer;
		AbstractWish wish;
		if (resultCode == RESULT_OK) {
			//Liste aller möglichen erkannten Treffer (das 0te ist meistens das richtig erkannte)
			treffer = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
			//das Erkannte als Toast ausgeben
			Toast.makeText(
					MainActivity.this, 
					treffer.get(0), 
					Toast.LENGTH_SHORT)
					.show();
			//Treffer behandeln
			if (treffer.get(0).equalsIgnoreCase("Wasser trinken")
					|| treffer.get(0).equalsIgnoreCase("trinken")
					|| treffer.get(0).equalsIgnoreCase("trinke Wasser")
					|| treffer.get(0).equalsIgnoreCase("Wasser")) {
				//Trinkwunsch erfüllen
				wish = Model.getInstance().getWishes().get(WishType.WishToDrink);
				if(wish != null) {
					fulfillWish(wish);
				}
			}
			else if (treffer.get(0).equalsIgnoreCase("Gehe schlafen")
					|| treffer.get(0).equalsIgnoreCase("schlafen")
					|| treffer.get(0).equalsIgnoreCase("schlafen gehen")) {
				//Schlafenswunsch erfüllen
				wish = Model.getInstance().getWishes().get(WishType.WishToSleep);
				if (wish != null) {
					fulfillWish(wish);
					sleep();
				}
			}
			else if(treffer.get(0).equalsIgnoreCase("iss")
					|| treffer.get(0).equalsIgnoreCase("essen")) {
				//Essenswunsch erfüllen
				wish = Model.getInstance().getWishes().get(WishType.WishToEat);
				if (wish != null) {
					fulfillWish(wish);
				}
			}
			else if(treffer.get(0).equalsIgnoreCase("medizin")
					|| treffer.get(0).equalsIgnoreCase("medizin einnehmen")
					|| treffer.get(0).equalsIgnoreCase("tabletten nehmen")
					|| treffer.get(0).equalsIgnoreCase("tabletten")) {
				//Medizinwunsch erfüllen
				wish = Model.getInstance().getWishes().get(WishType.WishToTakeMedicine);
				if(wish != null) {
					fulfillWish(wish);
				}
			}
			else if(treffer.get(0).equalsIgnoreCase("wäsche waschen")
					|| treffer.get(0).equalsIgnoreCase("waschen")
					|| treffer.get(0).equalsIgnoreCase("wasche wäsche")
					|| treffer.get(0).equalsIgnoreCase("wäsche")
					|| treffer.get(0).equalsIgnoreCase("mach wäsche")) {
				//Waschwunsch erfüllen
				wish = Model.getInstance().getWishes().get(WishType.WishToWashClothes);
				if (wish != null) {
					fulfillWish(wish);
				}
			}
			else if(treffer.get(0).equalsIgnoreCase("abwaschen")
					|| treffer.get(0).equalsIgnoreCase("spülen")
					|| treffer.get(0).equalsIgnoreCase("spüle geschirr")
					|| treffer.get(0).equalsIgnoreCase("wasch ab")
					|| treffer.get(0).equalsIgnoreCase("geschirr")) {
				//Geschirr-Spüllenwunsch erfüllen
				wish = Model.getInstance().getWishes().get(WishType.WishToWashDishes);
				if (wish != null) {
					fulfillWish(wish);
				}
			}
			else if(treffer.get(0).contains("einkaufen")
					|| treffer.get(0).contains("kaufe ein")
					|| treffer.get(0).contains("kaufe")) {
				//Kaufe nur, wenn die Zuttat erkannt wurde
				String[] splitResult = treffer.get(0).split(" ");

				ArrayList<String> ingredients = Model.ingredientsNames();
				for(int i = 0; i < splitResult.length; i++) {
					for (String key : ingredients) {
						if ( splitResult[i].equalsIgnoreCase(key) ) {
							//das Richtige auf MAX einkaufen
							Model.getInstance().buy(key, Model.LAGER_MAX_ANZAHL);
							Toast.makeText(MainActivity.this, key + " eingekauft",
									Toast.LENGTH_SHORT)
									.show();
							break;
						}
					}
				}
				//Einkaufswunsch erfüllen
				wish = Model.getInstance().getWishes().get(WishType.WishToShop);
				if(wish != null) {
					fulfillWish(wish);
				}
			}
		} else {
			//braucht man nur, wenn Ergebniss in einer Liste angezeigt werden soll
			treffer = new ArrayList<String>();
		}
	}
	
	//Lokales erfüllen der Wünsche
	public void fulfillWish(AbstractWish wish) {
		//erfülle im Model
		wish.fulfill();
		Toast.makeText(
				MainActivity.this, 
				"Wunsch erfüllt (" + Model.getInstance().getWishes().size() + " Wünsche übrig)", 
				Toast.LENGTH_SHORT)
				.show();
		//setze Wolke neu, da es sonst zu lange dauert
		setWishCloud();
	}

	//B R O A D C A S T   A B F A N G E N
	private BroadcastReceiver mReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			Bundle bundle = intent.getExtras();
			if(bundle.containsKey("wishCloud")) {
				//alle 5s aktualisieren
				setWishCloud();
			}
			if(bundle.containsKey("zaehler")) {
				//alle 1s aktualisieren
				setWishList();
				setClock();
			}
		}
	};

	//W U N S CH L I S T E
	private void setWishList() {
		//aktuallisiere nur, wenn Anzahl sich geändert hat, sonst passierts zu oft
		if(lastCountOfWishes != Model.getInstance().getWishes().size()){
			List<String> valueList = new ArrayList<String>();
			for (AbstractWish wish : Model.getInstance().getWishes()) {
				valueList.add(wish.toString());
			}
			ListAdapter adapter = new ArrayAdapter<String>(	MainActivity.this, 
					R.layout.mylist, 
					valueList);
			final ListView lv = (ListView)findViewById(R.id.wishListView);
			lv.setAdapter(adapter);
			lastCountOfWishes = Model.getInstance().getWishes().size();
		}
	}
	
	//U H R ZE I T   /   C O U N T D O W N   S E T Z E N 
	private void setClock() {
		String timeString = "";
		if (Model.getInstance().getState() == State.Sleeping || clockState == ClockMode.Sleeping) {
			// Zeige wie lange Oma noch schlafen wird
			if (Model.getInstance().getWakeUpTime() == 0) {
				timeString = Model.millisToString(0);
			}
			else if (Model.getInstance().getState() == State.Awake || clockState == ClockMode.Awake) {
				timeString = Model.millisToString(Model.getInstance().getWakeUpTime() - System.currentTimeMillis());
			}
		}
		else if (Model.getInstance().getState() == State.Awake || clockState == ClockMode.Awake) {
			// Zeige aktuelle Uhrzeit
			timeString = Model.millisToString(System.currentTimeMillis());
		}
		((TextView) findViewById(R.id.digital_clock)).setText(timeString);
	}

	//W U N S C H W OL K E
	protected void setWishCloud() {
		index++;
		if (index > Model.getInstance().getWishes().size() - 1) {
			index = 0;
		}
		if (Model.getInstance().getState() == State.Awake) {
			//Oma schlaeft nicht, buttons enable
			wakeup();
			if (!Model.getInstance().getWishes().isEmpty()) {
				//WunschWolke neben der Oma einblenden
				ImageView img = (ImageView)findViewById(R.id.imageWunsch);
				img.setVisibility(View.VISIBLE);
				//setze das richtige Bild in die Wolke ein
				AbstractWish wish = Model.getInstance().getWishes().get(index);
				AbstractFood food = null;
				switch (wish.getType()) {
				case WishToEat:
					food = ((WishToEat) wish).getFood();
					switch (food.getType()) {
					case BockwurstMitKartoffeln:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_bockwurst);
						break;
					case Erbseneintopf:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_erbseneintopf);
						break;
					case Griessbrei:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_griessbrei);
						break;
					case HaferflockenMitMilch:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_haferflocken);
						break;
					case Cheesburger:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_hamburger);
						break;
					case Salat:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_salat);
						break;
					case Sandwich:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_sandwich);
						break;
					case Schnitzel:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_schnitzel);
						break;
					case Steak:
						img = (ImageView)findViewById(R.id.imageWunsch);
						img.setImageResource(R.drawable.wunschwolke_steak);
						break;
					} // End of WishToEat
					break;
				case WishToDrink:
					img = (ImageView)findViewById(R.id.imageWunsch);
					img.setImageResource(R.drawable.wunschwolke_water);
					break;
				case WishToSleep:
					img = (ImageView)findViewById(R.id.imageWunsch);
					img.setImageResource(R.drawable.wunschwolke_schlafen);
					break;
				case WishToTakeMedicine:
					img = (ImageView)findViewById(R.id.imageWunsch);
					img.setImageResource(R.drawable.wunschwolke_medicin);
					break;
				case WishToShop:
					img = (ImageView)findViewById(R.id.imageWunsch);
					img.setImageResource(R.drawable.wunschwolke_einkaufen);
					break;
				case WishToWashClothes:
					img = (ImageView)findViewById(R.id.imageWunsch);
					img.setImageResource(R.drawable.wunschwolke_waschen);
					break;
				case WishToWashDishes:
					img = (ImageView)findViewById(R.id.imageWunsch);
					img.setImageResource(R.drawable.wunschwolke_spuehlen);
					break;
				case WishToCleanApartment:
					img = (ImageView)findViewById(R.id.imageWunsch);
					img.setImageResource(R.drawable.wunschwolke_putzen);
					break;
				}
			}
			else {
				//wenn kein Wunsch vorhanden, Bilder ausschalten
				ImageView img = (ImageView)findViewById(R.id.imageWunsch);
				img.setVisibility(View.INVISIBLE);
			}
		}else{
			//Oma schläft, keine wolke
			sleep();
		}
	}
	
	
	public void sleep() {
		findViewById(R.id.btn_ma_einkaufen).setEnabled(false);
		findViewById(R.id.btn_ma_essen_trinken).setEnabled(false);
		findViewById(R.id.btn_ma_medikamente).setEnabled(false);
		findViewById(R.id.btn_ma_putzen_waschen_spuelen).setEnabled(false);
		//		WishCloud deaktivieren
		findViewById(R.id.imageWunsch).setVisibility(View.INVISIBLE);
		((ImageView)findViewById(R.id.grandMa)).setImageResource(R.drawable.grandma_disable);
		if(grandMaAnimation != null)
			grandMaAnimation.stopGrandmaAnimation();
	}
	public void wakeup() {
		findViewById(R.id.btn_ma_einkaufen).setEnabled(true);
		findViewById(R.id.btn_ma_essen_trinken).setEnabled(true);
		findViewById(R.id.btn_ma_medikamente).setEnabled(true);
		findViewById(R.id.btn_ma_putzen_waschen_spuelen).setEnabled(true);
		//		WishCloud aktivieren
		findViewById(R.id.imageWunsch).setVisibility(View.VISIBLE);
		((ImageView)findViewById(R.id.grandMa)).setImageResource(R.drawable.grandma_normal);
		findViewById(R.id.grandMa).setVisibility(View.VISIBLE);
		//Schaukeln, wenn sie noch nicht schaukelt
		if(grandMaAnimation != null && !grandMaAnimation.isRunning)
			grandMaAnimation.startGrandmaAnimation();

	}

	//prüfe, dass Service nicht zweimal gestartet wird
	private boolean isAliveServiceRunning() {
		ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
		for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
			if (AliveService.class.getName().equals(service.service.getClassName())) {
				return true;
			}
		}
		return false;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//Restore Modeldata
		if(mainActivity == null) {
			DatabaseBot.getBot(this).restoreModelData();
		}
		mainActivity = this;

		//GrandMa-Animation
		grandMaAnimation = new GrandmaAnimation(this);
		grandMaAnimation.startGrandmaAnimation();
		//start mainService in background
		if(!isAliveServiceRunning()){
			startService(new Intent(this, AliveService.class)); 
		}
		 //register receiver for mainThread
		getApplicationContext().registerReceiver(mReceiver, new IntentFilter(AliveService.ACTION_BROADCAST));

		//Spracherkennung falls vorhanden
		PackageManager packageManager = getPackageManager();
		List<ResolveInfo> activities = packageManager.queryIntentActivities(
				new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 
				0);
		if (activities.size() == 0) {
			View mic = 
					findViewById(R.id.btn_microphone);
			mic.setVisibility(View.GONE);
		}
	}


	@Override
	protected void onPause() {
		Model.getInstance().inAppFocus = false;
		super.onPause();
	}
	@Override
	protected void onResume() {
		super.onResume();
		Model.getInstance().inAppFocus = true;
		lastCountOfWishes = -1;
		setWishList();
		setWishCloud();
		setClock();
		//Benachrichtigungen reseten
		Model.getInstance().setNotificationCount(0);
		NotificationManager notificationManager = (NotificationManager) this.getSystemService(this.NOTIFICATION_SERVICE);
		notificationManager.cancelAll();
	}
	@Override
	protected void onStart() {
		super.onStart();
	}
	@Override
	protected void onStop() {
		super.onStop();
	}
	@Override
	protected void onDestroy() {
		//Save Modeldata
		DatabaseBot.getBot(this).saveModelData();
		super.onDestroy();
	}
}
